package main

func main() {
	_ = make([]int, 0, 20) // len=0 cap=20
	_ = make([]int, 0, 20000)
	l := 20
	_ = make([]int, 0, l)
}

// go build -gcflags '-m -l' escape2.go
//./escape2.go:5:10: make([]int, 0, 20) does not escape
//./escape2.go:6:10: make([]int, 0, 20000) escapes to heap // 占用内存过大，发生逃逸
//./escape2.go:8:10: make([]int, 0, l) escapes to heap   // 长度不固定，发生逃逸

// 逃逸分析总结
// 逃逸分析在编译阶段完成
// 对于函数外部没有引用的对象，也有可能放到堆中，比如内存占用过大、长度不固定
// 对于被外部函数所引用（离开作用域）且对象为指针类型，一定会分配到堆上
